#include <sqlite3.h>
#include <stdio.h>

/*
	parameterized abj: 参数化的
				  v  : 使参数化的	
	现在我们将提到参数化查询。
	参数化查询（也称为预准备语句）可提高安全性和性能。
	当我们使用参数化查询时，我们使用占位符，而不是直接将值写入语句中。

	在此示例中，问号 （?） 用作占位符，稍后将替换为实际值。

	gcc -o parameterized parameterized.c -lsqlite3
	./parameterized
*/

int main(void) {
    
    sqlite3 *db;
    char *err_msg = 0;

    //这个结构体用来描述一个SQL语句对象
    sqlite3_stmt *res;
    
    int rc = sqlite3_open("test.db", &db);
    
    if (rc != SQLITE_OK) {
        
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        
        return 1;
    }

    //问号用于向 SQL 查询提供 ID。
    char *sql = "SELECT Id, Name FROM Cars WHERE Id = ?";

    //创建一个SQL语句对象
    rc = sqlite3_prepare_v2(db, sql, -1, &res, 0);
    
    if (rc == SQLITE_OK) {

		/*将整数值绑定到预准备语句。
		 占位符将替换为整数值 3。
		 第一个参数：SQL语句对象
         第二个参数：要绑定的变量在SQL语句对象中的索引值
         第三个参数： 要绑定的值
		sqlite3_bind_int()*/

        sqlite3_bind_int(res, 1, 3);
    } else {
        
        fprintf(stderr, "Failed to execute statement: %s\n", sqlite3_errmsg(db));
    }
    
    int step = sqlite3_step(res);
    
    if (step == SQLITE_ROW) {
        
        printf("%s: ", sqlite3_column_text(res, 0));
        printf("%s\n", sqlite3_column_text(res, 1));
        
    } 

    sqlite3_finalize(res);
    sqlite3_close(db);
    
    return 0;
}

